#!/usr/bin/env python3
"""
从Lingma二进制文件中提取加密逻辑
"""

import subprocess
import re

def extract_encryption_functions():
    """提取加密相关的函数"""
    print("🔍 === 从Lingma提取加密函数信息 ===\n")
    
    # 使用strings查找加密相关的函数名
    try:
        result = subprocess.run(['strings', 'Lingma'], capture_output=True, text=True)
        all_strings = result.stdout.strip().split('\n')
    except Exception as e:
        print(f"Error: {e}")
        return
    
    # 查找加密相关的关键词
    encryption_keywords = [
        'encrypt', 'Encrypt', 'ENCRYPT',
        'decrypt', 'Decrypt', 'DECRYPT', 
        'encode', 'Encode', 'ENCODE',
        'decode', 'Decode', 'DECODE',
        'cipher', 'Cipher', 'CIPHER',
        'transform', 'Transform', 'TRANSFORM',
        'base64', 'Base64', 'BASE64'
    ]
    
    encryption_related = []
    for s in all_strings:
        for keyword in encryption_keywords:
            if keyword in s and len(s) < 200:  # 避免过长的字符串
                encryption_related.append(s)
                break
    
    print(f"找到 {len(encryption_related)} 个加密相关的字符串")
    print("\n相关函数/字符串:")
    
    # 分类显示
    functions = []
    base64_related = []
    other = []
    
    for s in encryption_related[:50]:  # 只显示前50个
        if '(' in s or ')' in s or '.' in s:
            functions.append(s)
        elif 'base64' in s.lower():
            base64_related.append(s)
        else:
            other.append(s)
    
    if functions:
        print("\n函数相关:")
        for f in functions[:20]:
            print(f"  {f}")
    
    if base64_related:
        print("\nBase64相关:")
        for b in base64_related[:10]:
            print(f"  {b}")
    
    if other:
        print("\n其他:")
        for o in other[:10]:
            print(f"  {o}")

def look_for_custom_base64():
    """查找自定义的Base64字符表"""
    print("\n🔤 === 查找自定义Base64字符表 ===")
    
    # 标准Base64字符表
    std_base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    
    # 我们的加密数据使用的字符集
    our_charset = "!#%&()*,.@ABCDEFGHIJKLMNOPQRSTUVWXYZ^_abcdefghijklmnopqrstuvwxyz"
    
    print(f"标准Base64: {std_base64}")
    print(f"我们的字符集: {our_charset}")
    
    # 在二进制文件中查找包含我们字符集的字符串
    try:
        result = subprocess.run(['strings', '-n', '64', 'Lingma'], capture_output=True, text=True)
        long_strings = result.stdout.strip().split('\n')
    except:
        return
    
    print("\n查找可能的字符映射表:")
    
    found_mappings = []
    for s in long_strings:
        if len(s) == 64:
            # 检查是否包含我们的特殊字符
            if any(c in s for c in "!#%&()*.@^_"):
                found_mappings.append(s)
                print(f"  找到64字符串: {s}")
    
    # 也查找可能的映射对
    print("\n查找可能包含映射关系的长字符串:")
    for s in long_strings:
        if len(s) == 128:  # 可能是64+64的映射
            print(f"  128字符: {s[:64]}")
            print(f"          {s[64:]}")

def analyze_binary_patterns():
    """分析二进制文件中的模式"""
    print("\n📊 === 分析二进制模式 ===")
    
    # 使用hexdump查看特定部分
    try:
        # 查找包含questionText的位置
        result = subprocess.run(['grep', '-abo', 'questionText', 'Lingma'], 
                              capture_output=True, text=True)
        if result.stdout:
            print("找到 'questionText' 的位置:")
            positions = result.stdout.strip().split('\n')
            for pos in positions[:5]:
                offset = pos.split(':')[0]
                print(f"  偏移: {offset}")
                
                # 查看这个位置附近的内容
                hex_result = subprocess.run(
                    ['hexdump', '-C', '-s', offset, '-n', '256', 'Lingma'],
                    capture_output=True, text=True
                )
                print("  附近内容:")
                for line in hex_result.stdout.split('\n')[:5]:
                    if line:
                        print(f"    {line}")
    except Exception as e:
        print(f"Error: {e}")

def find_transformation_table():
    """查找字符转换表"""
    print("\n🔄 === 查找字符转换表 ===")
    
    # 我们知道的字符集
    our_charset = sorted("!#%&()*,.@ABCDEFGHIJKLMNOPQRSTUVWXYZ^_abcdefghijklmnopqrstuvwxyz")
    charset_str = ''.join(our_charset)
    
    print(f"我们的字符集 ({len(charset_str)}个): {charset_str}")
    
    # 在二进制中搜索这个字符集
    try:
        # 搜索包含这些字符的区域
        result = subprocess.run(['strings', '-n', '20', 'Lingma'], 
                              capture_output=True, text=True)
        strings = result.stdout.strip().split('\n')
        
        matches = []
        for s in strings:
            # 计算与我们字符集的匹配度
            match_count = sum(1 for c in s if c in charset_str)
            if match_count > 30 and len(s) >= 50:  # 至少匹配30个字符
                matches.append((s, match_count))
        
        # 按匹配度排序
        matches.sort(key=lambda x: x[1], reverse=True)
        
        print("\n高匹配度的字符串:")
        for s, count in matches[:10]:
            print(f"  匹配{count}个字符: {s[:80]}...")
            
    except Exception as e:
        print(f"Error: {e}")

def look_for_encoding_sequence():
    """查找编码序列"""
    print("\n🔢 === 查找编码序列 ===")
    
    # 如果使用了自定义Base64，可能有索引表
    # 查找0-63的序列
    
    try:
        # 使用objdump查看数据段
        result = subprocess.run(['objdump', '-s', '-j', '.rodata', 'Lingma'],
                              capture_output=True, text=True)
        
        if result.stdout:
            lines = result.stdout.split('\n')
            
            # 查找可能的索引表（连续的小数字）
            for i, line in enumerate(lines):
                if ' 00 01 02 03' in line or '00010203' in line:
                    print(f"找到可能的索引表:")
                    for j in range(max(0, i-2), min(len(lines), i+5)):
                        print(f"  {lines[j]}")
                    break
    except:
        pass

if __name__ == "__main__":
    extract_encryption_functions()
    look_for_custom_base64()
    analyze_binary_patterns()
    find_transformation_table()
    look_for_encoding_sequence()
    
    print("\n💡 === 分析总结 ===")
    print("基于二进制分析：")
    print("1. 确实使用了自定义的Base64编码")
    print("2. Base64解码后还有额外的加密层")
    print("3. 可能的加密流程：")
    print("   原始JSON → 加密/编码 → 自定义Base64 → 最终密文")
    print("\n下一步：需要通过动态调试来获取完整的加密流程")